

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-04-21
 * Time: 9:37
 */
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        // 示例1：默认构造函数
        // 创建一个初始容量为 10 的空列表（JDK 不同版本默认容量可能不同）
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("Java");    // 添加元素到列表尾部
        list1.add("C++");
        System.out.println(list1); // 输出：[Java, C++]
        // 注意：ArrayList 的 toString 方法已被重写，会直接输出元素内容

        // 示例2：指定初始容量构造函数
        // 创建一个初始容量为 100 的空列表（仅优化性能，不影响列表逻辑功能）
        ArrayList<Integer> list2 = new ArrayList<>(100);
        list2.add(1);       // 添加 Integer 类型元素
        list2.add(2);
        // list2.add("hello"); // 编译错误：泛型<Integer>限制元素类型
        System.out.println(list2); // 输出：[1, 2]

        // 示例3：基于集合构造函数
        // 通过 list2 构造新列表 list3（深拷贝容器结构，浅拷贝元素引用）
        ArrayList<Integer> list3 = new ArrayList<>(list2);
        System.out.println(list3); // 输出：[1, 2]

        // 通过不可变集合构造列表
        List<Character> chars = List.of('a', 'b', 'c'); // Java 9+ 的工厂方法
        ArrayList<Character> list4 = new ArrayList<>(chars);
        System.out.println(list4); // 输出：[a, b, c]


        /* ************** 补充：浅拷贝风险 ************** */
        class Person {
            String name;
            Person(String name) { this.name = name; }
            void setName(String name) { this.name = name; }
            @Override
            public String toString() { return name; }
        }

        // 原列表包含可变对象
        ArrayList<Person> people = new ArrayList<>();
        people.add(new Person("Alice"));
        people.add(new Person("Bob"));
        System.out.println("原列表: " + people); // 输出：[Alice, Bob]

        // 通过集合构造函数创建新列表（浅拷贝：复制对象引用）
        ArrayList<Person> peopleCopy = new ArrayList<>(people);

        // 修改原列表中对象的内部状态
        people.get(0).setName("David"); // 修改第一个元素的名字

        // 两个列表中的元素引用相同对象！
        System.out.println("原列表: " + people);     // 输出：[David, Bob]
        System.out.println("新列表: " + peopleCopy); // 输出：[David, Bob]
        // 输出结果相同，证明两个列表存储的是同一对象的引用

        /* ************** 说明 ************** */
        // 如果希望实现深拷贝，需要手动克隆每个元素：
        ArrayList<Person> deepCopy = new ArrayList<>();
        for (Person p : people) {
            deepCopy.add(new Person(p.name)); // 创建新对象复制字段值
        }
        // 此时修改原列表元素不会影响 deepCopy
        people.get(0).setName("Lucy");
        System.out.println("深拷贝列表: " + deepCopy); // 输出：[David, Bob]
        System.out.println("原列表: " + people);  // 输出：[Lucy, Bob]
    }
}
